package com.shujia.custom.udtfdemo;

import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;

import java.util.ArrayList;

/*
    继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF
 */
public class MyUDTFDemo1 extends GenericUDTF {
    @Override
    public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {
        //指定输出的列的个数名字。以及类型
        //M1001#xiaohu#S324231212,ltb#M1002#S2543412432,S21312312412#M1003#kzw
        //1001 xiaohu 324231212
        //创建一个List集合存储列的名字
        ArrayList<String> colNames = new ArrayList<>();
        //创建一个集合存储每一列对象的类型，将每种类型封装成对象
        ArrayList<ObjectInspector> colTypes = new ArrayList<>();

        //将列的名字添加到集合以及列的数据类型添加到集合
        colNames.add("id");
        colTypes.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
        colNames.add("name");
        colTypes.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
        colNames.add("cardId");
        colTypes.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);

        //将列名和列的数据类型组合一起
        return ObjectInspectorFactory.getStandardStructObjectInspector(colNames,colTypes);
    }

    @Override
    public void process(Object[] args) throws HiveException {
        //在这里就编写实际的处理逻辑，传进来的每一列数据都会被封装成一个数组，如果只有一列数据，就去索引0就好了
        //M1001#xiaohu#S324231212,ltb#M1002#S2543412432,S21312312412#M1003#kzw
        //1001 xiaohu 324231212
        String line = String.valueOf(args[0]);
        //按照逗号分割得到每一个用户信息
        String[] userInfos = line.split(",");
        //动态初始化一个数组
        String[] strings = new String[3];

        //外层for循环得到的是每一个学生
        for (String userInfo : userInfos) {
            //再根据#分割得到学号，姓名，身份证号
            String[] infos = userInfo.split("#");
            for (String info : infos) {
                if(info.startsWith("M")){
                    //如果是以M开头，就是学号的信息，将其信息赋值给数组中的第一个元素
                    strings[0] = info.substring(1);
                }else if(info.startsWith("S")){
                    //如果是以S开头，就是身份证号的信息，将其信息赋值给数组中的第三个元素
                    strings[2] = info.substring(1);
                }else {
                    //如果既不是S开头也不是M开头，表示是姓名，将其信息赋值给数组中的第二个元素
                    strings[1] = info;
                }
            }

            //我们通过观察发现，使用内部提供的forward方法将处理的每一行写出去
            //将我们的每一行封装成一个数组进行返回
            forward(strings);
        }

    }

    @Override
    public void close() throws HiveException {

    }
}
